package com.example.yiqiuser.service.impl;

import com.example.yiqiuser.entity.Order;
import com.example.yiqiuser.entity.SbsnOrder;
import com.example.yiqiuser.service.PayService;
import com.example.yiqiuser.util.ConstantUtil;
import com.example.yiqiuser.util.HttpClient;
import com.example.yiqiuser.util.PayConfigUtil;
import com.github.wxpay.sdk.WXPayUtil;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * @ fileName:PayServiceImpl
 * @ description:
 * @ author:zhz
 * @ createTime:2023/3/31 12:40
 * @ version:1.0.0
 */
@Service
@Log4j2
public class PayServiceImpl implements PayService {

    @Override
    public Map getNativeByOrder(SbsnOrder sbsnOrder) {
        try {
            //统一下单   生成预支付的订单
            Map m = new HashMap();
            //参数
            m.put(PayConfigUtil.APP_ID, PayConfigUtil.APPID);
            //商户编号
            m.put("mch_id", ConstantUtil.PayConfig.MCH_ID);//"1558950191"
            //订单编号
            m.put("out_trade_no", sbsnOrder.getOrderno());
            //支付费用  1    -- Decimal(11,3)     99999999.999   multiply 乘法
            m.put("total_fee", new BigDecimal(sbsnOrder.getTprice()).multiply(new BigDecimal("100")).longValue() + ""); //单位 分
            //支付描述
            m.put("body", sbsnOrder.getTicketname());
            m.put("nonce_str", WXPayUtil.generateNonceStr());
            //处理支付回调ip
            m.put("spbill_create_ip", "127.0.0.1");
            //支付方式  目前使用native是扫码支付
            m.put("trade_type", "NATIVE");
            //唤醒地址   回调地址
            m.put("notify_url", "http://www.chenkaixiang.top/notifyWeiXinPay\n");
            //统一下单（使用微信系统是生成二维码）
            HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
            //设置请求参数和api_key
            client.setXmlParam(WXPayUtil.generateSignedXml(m, PayConfigUtil.API_KEY));
            //设置使用https请求方式
            client.setHttps(true);
            //执行
            client.post();
            //生成的预支付订单的消息
            String xml=client.getContent();//xml
            System.out.println("-------------"+xml);
            //把返回的xml字符串转换了map
            Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
            //打印返回值
            System.out.println(resultMap);
            //再次定义返回对象
            Map map = new HashMap<>();
            //map.put("out_trade_no", orederNum);
            //map.put("course_id", 1);
            //map.put("total_fee", 1 + "");
            //map.put("result_code", resultMap.get("result_code"));
            //放入的就是二维码地址
            map.put("code_url", resultMap.get("code_url"));
            return map;
        }catch(Exception e){
            // System.out.println(e.getMessage());
            log.error(e.getMessage());
        }
        return null;
    }

    @Override
    public Map getPayStatus(String orderid) {
        try {
            Map m = new HashMap();
            //参数
            m.put("appid", PayConfigUtil.APPID);
            m.put("mch_id", PayConfigUtil.MCH_ID);//"1558950191"
            m.put("out_trade_no", orderid+"");
            //1.00    1
            //m.put("total_fee", new BigDecimal(order.getPrice()*order.getNum()).multiply(new BigDecimal("100")).longValue() + ""); //单位 分
            m.put("nonce_str", WXPayUtil.generateNonceStr());
            //m.put("sign", "127.0.0.1");
            //m.put("trade_type", "NATIVE");
            HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
            client.setXmlParam(WXPayUtil.generateSignedXml(m, PayConfigUtil.API_KEY));
            client.setHttps(true);
            client.post();
            String xml = client.getContent();//xml
            System.out.println("支付后的信息========" + xml);
            //System.out.println("支付后的信息========" + xml);
            //xml转map
            Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
            System.out.println("支付之后的信息的内容==================="+resultMap);
            return resultMap;
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
}
